package com.sprouting.ops.interfaces;


import com.sprouting.ops.exception.ServiceException;

import java.beans.Introspector;
import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;
import java.util.function.Function;

/**
 * 自定义lambda根据对象获取属性名称，注意，不是属性的值，是名称
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2023/8/23 17:43
 */
@FunctionalInterface
public interface TypeFunction<T, R> extends Serializable, Function<T, R> {

    /**
     * 获取列名称
     * @param lambda 要获取的数据
     * @return String
     */
    static String getLambdaColumnName(Serializable lambda) {
        try {
            Method method = lambda.getClass().getDeclaredMethod("writeReplace");
            method.setAccessible(Boolean.TRUE);
            SerializedLambda serializedLambda = (SerializedLambda) method.invoke(lambda);
            String getter = serializedLambda.getImplMethodName();
            return Introspector.decapitalize(getter.replace("get", ""));

        } catch (ReflectiveOperationException e) {
            throw new ServiceException("获取属性名称失败");
        }
    }
}
